/**
 * 1
 *  
 * @Author : roryrywang
 * @DateTime : 24-9-11 下午2:48
 */

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>

using namespace std;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 将左表（旧表）和右表（新表）进行差异比对，返回两张表的新增/修改/删除行的信息。 入参包含4个，分别对应左表（旧表）和右表（新表）的主键列和值列，第1个参数是左表的主键列表，第2个参数是左表的值列表，第3个参数是右表的主键列表，第4个参数是右表的值列表。 出参是个双层的列表，内部包含了3个列表，第1个列表是新增行id列表，第2个列表是修改行id列表，第3个列表是删除行id列表，这3个列表均按id升序排列。
     * @param leftIds long长整型vector 左表的id列表，递增
     * @param leftValues string字符串vector 左表的值列表，参数2和参数1列表长度相同，其元素是一一对应关系
     * @param rightIds long长整型vector 右表的id列表，递增
     * @param rightValues string字符串vector 右表的值列表，参数4和参数3列表长度相同，其元素是一一对应关系
     * @return long长整型vector<vector<>>
     */
    vector<vector<long>>
    diff(vector<long> &leftIds, vector<string> &leftValues, vector<long> &rightIds, vector<string> &rightValues) {
        vector<vector<long>> res(3);
        unordered_map<long, string> mapl;
        unordered_map<long, string> mapr;
        long maxValue = -1;
        for (int i = 0; i < leftIds.size(); ++i) {
            mapl[leftIds[i]] = leftValues[i];
            maxValue = max(maxValue, leftIds[i]);
        }
        for (int i = 0; i < rightIds.size(); ++i) {
            mapr[rightIds[i]] = rightValues[i];
            maxValue = max(maxValue, rightIds[i]);
        }
        for (int i = 1; i <= maxValue; ++i) {
            if (mapl.count(i) && mapr.count(i)) {
                if (mapl[i] != mapr[i]) {
                    res[1].push_back(i);
                }
            } else if (mapl.count(i)) {
                res[2].push_back(i);
            } else if (mapr.count(i)) {
                res[0].push_back(i);
            }
        }
        return res;
    }
};
